#ifndef _LIST_H_
#define _LIST_H_

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef void LIST;          //将数据结构隐藏

#define LIST_FORWARD 1     //首部插入
#define LIST_BACKWARD 2    //尾部插入

typedef void list_op(const void *);
typedef int list_cmp(const void *, const void *);

LIST *list_create(int initsize);  //创建链表，实现一个带头结点的空的双向链表

int list_insert(LIST *,const void *data,int mode);

//第二个参数：指向回调函数入口地址的指针
void list_show(LIST *, list_op *);

void *list_find(LIST *, void *key, list_cmp *);

int list_delete(LIST *, const void *key, list_cmp *);  

//fetch和delete不同，fetch是删除并拿回数据(保存在void * data中)，而删除是直接丢弃(仅此一点区别)
int list_fetch(LIST *,const void * key,list_cmp *,void * data);

void list_destory(LIST **);

#endif